import os, shutil
import json
import random
import string
from copy import deepcopy
import sys
import re
import time, datetime
import win32api
import win32print
from docx import Document
from docx.enum.text import WD_ALIGN_PARAGRAPH
import xlrd
import pyperclip

parentDir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.insert(0, parentDir)
from root import BASE_DIR


def generate_rdm_name(lenth):
    # 生成lenth位随机字符串

    return ''.join(random.sample(string.ascii_letters + string.digits, int(lenth)))


def print_file(filename):
    # 打印文件名为filename的文件
    filename = os.path.abspath(filename)
    win32api.ShellExecute(0, 'print', filename, '/d:"%s"' % win32print.GetDefaultPrinter(), '.', 0)


def keyword():
    url = os.path.join(BASE_DIR, "myjson", "key_words.json")
    with open(url, mode='r', encoding="utf8") as f:
        keywords = json.load(f)

    return keywords


def read_json(filename):
    if not os.path.exists(os.path.join(BASE_DIR, "myjson", filename)):
        return
    with open(os.path.join(BASE_DIR, "myjson", filename), mode='r', encoding="utf8") as f:
        json_result = json.load(f)
    return json_result


def add_json(filename, json_obj):
    with open(os.path.join(BASE_DIR, "myjson", filename), mode='w', encoding="utf8") as f:
        json.dump(json_obj, f, ensure_ascii=False)


def do_string(matched):
    if matched.group(2):
        year_value = int(matched.group(2))
    else:
        year_value = 0
    if matched.group(4):
        month_value = int(matched.group(4)) / 12

    else:
        month_value = 0

    return str(year_value + month_value) if year_value + month_value else ''


def form_TPRBP(age):
    age = re.sub(r'\d+天', '', age)
    if not re.search(r'((\d*)岁)?((\d*)月)?', age).group():
        return ''
    else:
        age = float(re.sub(r'((\d*)岁)?((\d*)月)?', do_string, age))

        result = ''
        temp = '36.%s' % random.randint(1, 9)

        with open('.\\myjson\\TPRBP.json', 'r', encoding='utf-8') as f:
            base_data = json.load(f)
        for each_data in base_data:
            if each_data['age'][0] < age <= each_data['age'][1]:
                pulse = random.randrange(*each_data['pulse'])
                respire = random.randrange(*each_data['respire'])
                sbp = random.randrange(*each_data['sbp'])
                dbp = int(sbp * 2 / 3)
                result = 'T：%s℃  P：%s次/分 R：%s次/分 BP：%s/%smmHg W：' % (
                    temp, pulse, respire, sbp, dbp)
                break

        return result


def zrcf_split_mode(kind_flag, symptom_selected, difdig_selected, patient_info):
    # 分体式模式
    tprbp = form_TPRBP(age=patient_info['年龄'], ).rstrip(" W：")
    tprbp_list = tprbp.split()
    # 如果年龄小于8岁则不显示血压
    try:
        age_ = int(patient_info['年龄'].split('岁')[0])
        if age_ < 8:
            tprbp = " ".join(tprbp_list[:-1])
    except Exception as e:
        # 带几岁几月或者几月几天的int函数会出错，表示也小于8岁
        tprbp = " ".join(tprbp_list[:-1])
    # 生成：心率：98次/分之类，并与TPRBP里的心率一致。
    # p = tprbp_list[1]
    # p = re.split(r"[:：]", p)[-1]
    # pys_exam = re.sub(r'(心率)(\d+)次/分', lambda x: x.group(1) + p, patient_info.setdefault('入院体检', '无信息'))
    pys_exam = re.sub(r'(心)(率\d+次/分)([,，。.])', lambda x: x.group(1) , patient_info.setdefault('入院体检', '无信息'))
    # 清洗干净"诊疗计划"
    treatment_plan = patient_info.setdefault('诊疗计划', '无信息')
    treatment_plan = re.sub(r"请陈志鑫中医主治医师.+?治疗。", '', treatment_plan)
    treatment_plan = re.sub(r"压缩雾化吸入使雾化.+?疗效。", '', treatment_plan)
    if kind_flag == "副主任查房":
        # 副主任医师查房                  
        # mod = "今日查房，%s，查体：%s %s 王亚妮副主任医师查房仔细询问病史：%s，%s，%s %s 入院查体：%s %s 辅助检查：%s 根据以上资料，王亚妮副主任医师考虑诊断为%s 鉴别诊断：%s 治疗：%s 继续完善相关检查明确诊断，嘱合理饮食：忌食生冷辛辣油腻食物，清淡、优质蛋白饮食。观察病情变化。上级医师查房意见已执行。"
        # 自己查房
        mod = "今日查房，%s ，查体：%s 回顾病史：%s，%s，%s %s 入院查体：%s 辅助检查：%s 根据以上资料，目前考虑诊断为%s 鉴别诊断：%s 治疗：%s 继续完善相关检查明确诊断，嘱合理饮食：忌食生冷辛辣油腻食物，清淡、优质蛋白饮食。观察病情变化。"
        result = mod % (
            symptom_selected,
            # tprbp,
            pys_exam,
            patient_info.setdefault('姓名', '无信息'),
            patient_info.setdefault('性别', '无信息'),
            patient_info.setdefault('年龄', '无信息'),
            patient_info.setdefault('病例特点', '无信息'),
            # patient_info.setdefault('TPRBP', '无信息'),
            patient_info.setdefault('入院体检', '无信息'),
            patient_info.setdefault('入院化验单', '无信息'),
            patient_info.setdefault('诊断', '无信息'),
            difdig_selected,
            treatment_plan,
        )
    else:
        # mod = "汇报病史：%s，%s，%s %s 入院查体：%s %s 入院前检查：%s 陈芳主任医师查房：%s 查体：%s %s 辅助检查：%s 影像学：%s 根据患儿病史、临床表现、体征及辅助检查，目前诊断考虑：%s 应与以下疾病鉴别：%s 治疗：%s 嘱病房勤开窗通风，勤饮水扣背，清淡饮食。观察病情变化。上级医师查房意见已执行。"
        # mod = "汇报病史：%s，%s，%s %s 入院查体：%s 入院前检查：%s 陈芳主任医师查房：%s ，查体：%s 辅助检查：%s 根据患儿病史、临床表现、体征及辅助检查，目前诊断考虑：%s 应与以下疾病鉴别：%s 治疗：%s 嘱病房勤开窗通风，勤饮水扣背，清淡饮食。观察病情变化。上级医师查房意见已执行。"
        mod = "今日查房：%s ，查体：%s 辅助检查：%s 陈芳主任医师首次查房，患者病情：%s，%s，%s %s 入院查体：%s 入院前检查：%s 根据患儿病史、临床表现、体征及辅助检查，目前诊断考虑：%s 应与以下疾病鉴别：%s 治疗：%s 嘱病房勤开窗通风，勤饮水扣背，清淡饮食。观察病情变化。上级医师查房意见已执行。"
        result = mod % (
            
            symptom_selected,
            # tprbp,
            pys_exam,
            patient_info.setdefault('化验单', '无信息'),
            
            patient_info.setdefault('姓名', '无信息'),
            patient_info.setdefault('性别', '无信息'),
            patient_info.setdefault('年龄', '无信息'),
            patient_info.setdefault('病例特点', '无信息'),
            
            # patient_info.setdefault('TPRBP', '无信息'),
            patient_info.setdefault('入院体检', '无信息'),
            
            patient_info.setdefault('入院化验单', '无信息'),
            
           
            patient_info.setdefault('诊断', '无信息'),
            difdig_selected,
            treatment_plan,
        )

    return result


def zrcf(kind_flag, symptom_selected, difdig_selected, patient_info):
    # 正常模式
    baby = False
    if  "岁" not in patient_info['年龄']:
        baby = True
    tprbp = form_TPRBP(age=patient_info['年龄'], ).rstrip(" W：")
    tprbp_list = tprbp.split()
    # 如果年龄小于8岁则不显示血压
    try:
        age_ = int(patient_info['年龄'].split('岁')[0])
        if age_ < 8:
            tprbp = " ".join(tprbp_list[:-1])
            
    except Exception as e:
        # 带几岁几月或者几月几天的int函数会出错，表示也小于8岁
        tprbp = " ".join(tprbp_list[:-1])
    # 生成：心率：98次/分之类，并与TPRBP里的心率一致。
    p = tprbp_list[1]
    p = re.split(r"[:：]", p)[-1]
    pys_exam = re.sub(r'(心率)(\d+)次/分', lambda x: x.group(1) + p, patient_info.setdefault('入院体检', '无信息'))
   
    # 清洗干净"诊疗计划"
    treatment_plan = patient_info.setdefault('诊疗计划', '无信息')
    treatment_plan = re.sub(r"请陈志鑫中医主治医师.+?治疗。", '', treatment_plan)
    treatment_plan = re.sub(r"压缩雾化吸入使雾化.+?疗效。", '', treatment_plan)
    if kind_flag == "副主任查房":
        # 副主任医师查房                  
        # mod = "今日查房，%s，查体：%s %s 王亚妮副主任医师查房仔细询问病史：%s，%s，%s %s 入院查体：%s %s 辅助检查：%s 根据以上资料，王亚妮副主任医师考虑诊断为%s 鉴别诊断：%s 治疗：%s 继续完善相关检查明确诊断，嘱合理饮食：忌食生冷辛辣油腻食物，清淡、优质蛋白饮食。观察病情变化。上级医师查房意见已执行。"
        # 自己查房
        if baby:
            
            mod = "今日查房，%s ，查体：%s %s 回顾病史：%s，%s，%s %s 入院查体：%s 辅助检查：%s 根据以上资料，目前考虑诊断为%s 鉴别诊断：%s 治疗：%s 继续完善相关检查明确诊断，嘱科学喂养，适量喂水、叩背，避免受凉。观察病情变化。"
        else:
            mod = "今日查房，%s ，查体：%s %s 回顾病史：%s，%s，%s %s 入院查体：%s 辅助检查：%s 根据以上资料，目前考虑诊断为%s 鉴别诊断：%s 治疗：%s 继续完善相关检查明确诊断，嘱合理饮食：忌食生冷辛辣油腻食物，清淡、优质蛋白饮食。观察病情变化。"
        result = mod % (
            symptom_selected,
            tprbp,
            pys_exam,
            patient_info.setdefault('姓名', '无信息'),
            patient_info.setdefault('性别', '无信息'),
            patient_info.setdefault('年龄', '无信息'),
            patient_info.setdefault('病例特点', '无信息'),
            # patient_info.setdefault('TPRBP', '无信息'),
            patient_info.setdefault('入院体检', '无信息'),
            patient_info.setdefault('入院化验单', '无信息'),
            patient_info.setdefault('诊断', '无信息'),
            difdig_selected,
            treatment_plan,
        )
    else:
        # mod = "汇报病史：%s，%s，%s %s 入院查体：%s %s 入院前检查：%s 陈芳主任医师查房：%s 查体：%s %s 辅助检查：%s 影像学：%s 根据患儿病史、临床表现、体征及辅助检查，目前诊断考虑：%s 应与以下疾病鉴别：%s 治疗：%s 嘱病房勤开窗通风，勤饮水扣背，清淡饮食。观察病情变化。上级医师查房意见已执行。"
        if baby:
            # mod = "汇报病史：%s，%s，%s %s 入院查体：%s 入院前检查：%s 陈芳主任医师查房：%s ，查体：%s %s 辅助检查：%s 根据患儿病史、临床表现、体征及辅助检查，目前诊断考虑：%s 应与以下疾病鉴别：%s 治疗：%s 嘱病房勤开窗通风，勤喂水扣背，合理喂养。观察病情变化。上级医师查房意见已执行。"
            mod = "今日查房：%s ，查体：%s %s 辅助检查：%s 陈芳主任医师首次查房，患者病情：%s，%s，%s %s 入院查体：%s 入院前检查：%s 根据患儿病史、临床表现、体征及辅助检查，目前诊断考虑：%s 应与以下疾病鉴别：%s 治疗：%s 嘱病房勤开窗通风，勤喂水扣背，合理喂养。观察病情变化。上级医师查房意见已执行。"
        else:
            mod = "今日查房：%s ，查体：%s %s 辅助检查：%s 陈芳主任医师首次查房，患者病情：%s，%s，%s %s 入院查体：%s 入院前检查：%s 根据患儿病史、临床表现、体征及辅助检查，目前诊断考虑：%s 应与以下疾病鉴别：%s 治疗：%s 嘱病房勤开窗通风，勤饮水扣背，清淡饮食。观察病情变化。上级医师查房意见已执行。"
            # mod = "汇报病史：%s，%s，%s %s 入院查体：%s 入院前检查：%s 陈芳主任医师查房：%s ，查体：%s %s 辅助检查：%s 根据患儿病史、临床表现、体征及辅助检查，目前诊断考虑：%s 应与以下疾病鉴别：%s 治疗：%s 嘱病房勤开窗通风，勤饮水扣背，清淡饮食。观察病情变化。上级医师查房意见已执行。"
        result = mod % (
            symptom_selected,
            tprbp,
            pys_exam,
            patient_info.setdefault('化验单', '无信息'),
            
            patient_info.setdefault('姓名', '无信息'),
            patient_info.setdefault('性别', '无信息'),
            patient_info.setdefault('年龄', '无信息'),
            patient_info.setdefault('病例特点', '无信息'),
            
            # patient_info.setdefault('TPRBP', '无信息'),
            patient_info.setdefault('入院体检', '无信息'),
            
            patient_info.setdefault('入院化验单', '无信息'),
            
            
           
            patient_info.setdefault('诊断', '无信息'),
            difdig_selected,
            treatment_plan,
        )

    return result


def cmc_content(text_info, kind="首次沟通", fill={'时间': '', '内容': ''}):
    if not os.path.exists('.\\沟通'):
        os.mkdir('.\\沟通')
    d = Document(f'.\\mydocx\\{kind}.docx')

    # 获取word文档内的表格列表
    t = d.tables
    # 第一个表格为病人基本信息，包括姓名、性别、年龄、住院号
    t1 = t[0]

    # 姓名值位于t1.cell(0, 1)，即第一行第2列；
    run = t1.cell(0, 1).paragraphs[0].add_run(text_info['姓名'])
    run.font.name = '宋体'
    run.font.size = 140000
    # 性别值位于t1.cell(0, 2)，即第一行第3列；
    run = t1.cell(0, 2).paragraphs[0].add_run(text_info['性别'])
    run.font.name = '宋体'
    run.font.size = 140000
    # 年龄值位于t1.cell(0, 5)，即第一行第4列；
    run = t1.cell(0, 3).paragraphs[0].add_run(text_info['年龄'])
    run.font.name = '宋体'
    run.font.size = 140000
    # 住院号
    run = t1.cell(0, 4).paragraphs[0].add_run(text_info['住院号'])
    run.font.name = '宋体'
    run.font.size = 140000
    if kind == "首次沟通":
        # 沟通时间
        t2 = t[1]
        run = t2.cell(0, 0).paragraphs[0].add_run(text_info.get('入院时间', ""))
        run.font.name = '宋体'
        run.font.size = 150000
        # 沟通内容
        zljh = re.sub(r"请陈志鑫中医主治医师.+?治疗。", '', text_info.setdefault('诊疗计划', '无信息')) if text_info.setdefault('诊疗计划',
                                                                                                               '') else "无信息"
        zljh = re.sub(r"压缩雾化吸入使雾化.+?疗效。", '', zljh)                                                                                                       
        d1 = f"一、初步诊断：{text_info.get('诊断', '')}"
        d1 = ''
        d2 = f"二、病情状况及病程阶段：{text_info.get('病例特点', '')}可能进一步加重，亦可累及其他脏器，合并心肌损伤、肝损伤等多脏器损害，甚至呼吸循环衰竭等危及生命情况。"
        d2 = ''
        d3 = f"三、初步拟行的检查：{text_info.get('拟行检查', '')}"
        d3 = ''
        d4 = f"初步治疗计划：{zljh} {text_info.get('拟行检查', '')}"
        d5 = "在治疗过程中、后可能发生的、不可避免的不良反应及副作用：由于医学尚有许多未确定因素，疾病的发生、发展也因个体差异存在许多意外情况，在检查治疗过程中可能会出现：1.治疗效果差甚至无效；2.发生药物过敏反应、输液反应等；3.身体本身疾病加重或潜在并发症、伴发疾病发作致病情加重；4.其他不可预计的情形等情况。疾病进一步加重导致多脏器功能衰竭，严重时危及生命。"
        d6 = "六、患者的病情及预后：大部分患儿经治疗后症状缓解，各项指标逐渐恢复正常，小部分患儿可能出现反复发热、代谢紊乱、继发感染、甚至多脏器损害等。"
        d7 = "七、医师需要告知患者和患者及家属需要了解的其他情况：1）遵守医院病房管理各项规定，配合护士保持病房清洁、通风，按时缴纳住院费用，病情变化及时与主管医师或值班医师沟通。2）参加城乡居民医保患者3日内需要家长带身份证及户口本和农合证（医保卡）找主管医师审核身份，再到医院城乡居民医保办登记。"
    elif kind == "出院沟通":
        # 沟通时间
        t2 = t[1]
        run = t2.cell(0, 0).paragraphs[0].add_run(text_info.get('出院日期', ''))
        run.font.name = '宋体'
        run.font.size = 150000
        # 沟通内容

        d1 = f"一、初步诊断：{text_info.get('诊断', '')}"
        d2 = f"二、出院诊断：{text_info.get('出院诊断', '')}"
        d3 = f"三、简要诊疗经过及效果：{text_info.get('诊疗经过', '')}"
        d4 = f"四、出院后注意事项：应少去人多的公共场所，尽可能避免接触呼吸道感染患者，避免受凉、感染；指导合理饮食。"
        out_patient = re.split(r'[;；]', text_info.get('出院医嘱', ''))

        d5 = f"五、出院后用药及用法：{out_patient[0].strip().lstrip('1、')}"
        d6 = "六、是否定期随诊复查：1周后我院我科门诊复诊（南阳市中心医院7号楼1楼7诊室，电话：0377-65036131）。"
        d7 = "七、医师需要告知患者和患者及家属需要了解的其他情况：如有发热、腹痛、咳嗽加重等不适，及时就诊。"
        # -------------------------------------------------------------
        # out_patient = re.split(r'[;；]', text_info.get('出院医嘱', ''))
        # out_patient = text_info.get('出院医嘱', '')
        # d1 = f"一、初步诊断：{text_info.get('诊断', '')}"
        # d2 = f"二、出院诊断：{text_info.get('出院诊断', '')}"
        # d3 = f"简要诊疗经过及效果：{text_info.get('诊疗经过', '')}"
        # d4 = f"出院后注意事项：{text_info.get('出院医嘱', '')} 1周后我院我科门诊复诊（南阳市中心医院7号楼1楼7诊室，电话：0377-65036131）。如有发热、咳嗽等症状，及时就诊。"
        

        # d5 = d6 = d7 = ""
    else:
        # 沟通时间
        t2 = t[1]
        run = t2.cell(0, 0).paragraphs[0].add_run(fill['时间'])
        run.font.name = '宋体'
        run.font.size = 150000
        # 沟通内容
        d1 = fill['内容']
        d2 = d3 = d4 = d5 = d6 = d7 = ''
    d8 = "沟通结果：今日与家属_________就以上情况进行了沟通，并做出详细解释，患者家属已充分理解，表示同意。"
    d9 = "患方意见："
    d10 = "沟通医师：主治医师：陈白璐         患方签名："
    d11 = "主治医师：                        或"
    d12 = "(副)主任医师：         其授权人(监护人)签名：       与患者关系："
    # date_to_write = "\n".join([d1, d2, d3, d4, d5])

    # run = t3.cell(0, 0).paragraphs[0].add_run(date_to_write)
    # run.font.name = '宋体'
    # run.font.size = 140000
    # t3.cell(0, 0).paragraphs[0].paragraph_format.first_line_indent = 406400
    t3 = t[2]
    for each in [d1, d2, d3, d4, d5, d6, d7, d8, d9, ]:
        if each:
            p = t3.cell(0, 0).add_paragraph()
            run = p.add_run(each)
            run.font.name = '宋体'
            run.font.size = 150000
            p.paragraph_format.first_line_indent = 406400
            p.paragraph_format.line_spacing = 1.25
            p.paragraph_format.alignment = WD_ALIGN_PARAGRAPH.LEFT

    for each in [d10, d11, d12]:
        p = t3.cell(0, 0).add_paragraph()
        run = p.add_run(each)
        run.font.name = '宋体'
        run.font.size = 150000
        p.paragraph_format.line_spacing = 1.25
        p.paragraph_format.alignment = WD_ALIGN_PARAGRAPH.LEFT
    if not os.path.exists('temp'):
        os.mkdir('temp')
    random_file_name1 = text_info['姓名'] + kind
    random_file_name1 += generate_rdm_name(8)

    d.save('.\\沟通\\%s.docx' % random_file_name1)
    # 调试
    os.startfile(os.path.abspath('.\\沟通\\%s.docx' % random_file_name1))
    # print_file(os.path.abspath('.\\temp\\%s.docx' % random_file_name1))


def zyhz_fill_word(text_info, date_dic, consult_content):
    cn_datetime_f = date_dic
    d = Document('.\\mydocx\\中医会诊单.docx')

    # 获取word文档内的表格列表
    t = d.tables
    # 第一个表格为病人基本信息，包括姓名、性别、年龄
    t1 = t[0]

    info_0 = "姓名：%s       性别：%s       年龄：%s    床号：%s    住院号：%s" % (
        text_info["姓名"],
        text_info["性别"],
        text_info["年龄"],
        text_info["床号"],
        text_info["住院号"],
    )
    run = t1.cell(0, 0).paragraphs[0].add_run(info_0)
    run.font.name = '宋体'
    run.font.size = 140000

    run = t1.cell(2, -1).paragraphs[0].add_run(cn_datetime_f['start_time'])
    run.font.name = '宋体'
    run.font.size = 140000
    info_bref = consult_content["病史"]
    run = t1.cell(4, 0).paragraphs[0].add_run(info_bref)
    run.font.name = '宋体'
    run.font.size = 140000

    run = t1.cell(6, 0).paragraphs[0].add_run(text_info["诊断"])
    run.font.name = '宋体'
    run.font.size = 140000

    run = t1.cell(11, -1).paragraphs[0].add_run(cn_datetime_f['arrivel_time'])
    run.font.name = '宋体'
    run.font.size = 140000

    run = t1.cell(12, 0).paragraphs[0].add_run(consult_content["总结"])
    run.font.name = '宋体'
    run.font.size = 140000
    run = t1.cell(14, 0).paragraphs[0].add_run(consult_content["意见"])
    run.font.name = '宋体'
    run.font.size = 140000

    random_file_name1 = generate_rdm_name(4)
    if not os.path.exists('中医会诊'):
        os.mkdir('中医会诊')

    d.save('.\\中医会诊\\%s_%s_%s.docx' % (text_info["姓名"], cn_datetime_f['start_time'].split()[0], random_file_name1))

    os.startfile(os.path.abspath(
        '.\\中医会诊\\%s_%s_%s.docx' % (text_info["姓名"], cn_datetime_f['start_time'].split()[0], random_file_name1)))





def dio_report(text_info):
    # 生成诊断证明
    d = Document('.\\mydocx\\诊断证明模板.docx')

    # 获取word文档内的表格列表
    t = d.tables
    # 第一个表格为病人基本信息，包括姓名、性别、年龄
    t1 = t[0]

    info_0 = "科别：儿童消化心血管科  姓名：%s  性别：%s  年龄：%s 住院号：%s" % (
        text_info.get("姓名"),
        text_info.get("性别"),
        text_info.get("年龄"),
        text_info.get("住院号"),
    )
    run = t1.cell(0, 0).paragraphs[0].add_run(info_0)
    run.font.name = '宋体'
    run.font.size = 140000

    info_1 = "工作单位或家庭地址：%s" % (text_info.get("现住址"))
    run = t1.cell(1, 0).paragraphs[0].add_run(info_1)
    run.font.name = '宋体'
    run.font.size = 140000

    info_2 = "门诊就诊日期：%s" % (text_info.get("入院时间").split()[0])
    run = t1.cell(2, 0).paragraphs[0].add_run(info_2)
    run.font.name = '宋体'
    run.font.size = 140000

    info_3 = "入院日期：%s  出院日期：%s" % (
        text_info.get("入院时间").split()[0].replace("-", "."), text_info.get("出院日期") if text_info.get("出院日期") not in
                                                                   ["无信息", "None", None] else "")
    run = t1.cell(3, 0).paragraphs[0].add_run(info_3)
    run.font.name = '宋体'
    run.font.size = 140000

    info_5 = "%s，%s，%s，以“%s”入院。体格检查：%s %s" % (
        text_info.get("姓名"),
        text_info.get("性别"),
        text_info.get("年龄"),
        text_info.get("主诉"),
        text_info.get("TPRBP"),
        text_info.get("入院体检"),
    )
    run = t1.cell(5, 0).paragraphs[0].add_run(info_5)
    run.font.name = '宋体'
    run.font.size = 140000

    info_7 = text_info.get("出院诊断") if text_info.get("出院诊断") != "无信息" else text_info.get(
        "诊断")
    run = t1.cell(7, 0).paragraphs[0].add_run(info_7)
    run.font.name = '宋体'
    run.font.size = 140000

    info_9 = text_info.get(
        "出院医嘱") if text_info.get("出院医嘱") != "无信息" else "继续口服药物巩固治疗，1周后复诊，不适随诊。"
    run = t1.cell(9, 0).paragraphs[0].add_run(info_9)
    run.font.name = '宋体'
    run.font.size = 140000

    info_11 = time.strftime("%Y.%m.%d", time.localtime())
    run = t1.cell(11, 0).paragraphs[0].add_run(info_11)
    run.font.name = '宋体'
    run.font.size = 140000
    save_name = "%s_%s" % (time.strftime("%Y%m%d",
                                         time.localtime()), text_info.get("姓名"))

    if not os.path.exists('.\\诊断证明'):
        os.mkdir('.\\诊断证明')
    d.save('.\\诊断证明\\%s.docx' % save_name)
    os.startfile('.\\诊断证明\\%s.docx' % save_name)
    # print_file(os.path.abspath('E:\\诊断证明\\%s.docx' % save_name))


def nutritional_evaluation(patient_info):
    # 营养评估
    info_to_fill_1 = '住院号：%s    姓名：%s    性别：%s    年龄：%s    病区：儿童消化心血管科 床号：%s' % (
        patient_info.setdefault('住院号', '无信息'),
        patient_info.setdefault('姓名', '无信息'),
        patient_info.setdefault('性别', '无信息'),
        patient_info.setdefault('年龄', '无信息'),
        patient_info.setdefault('床号', '无信息'),
    )

    info_to_fill_2 = '医师签字：                          测评日期：%s' % patient_info.setdefault(
        '入院时间', '无信息')
    d = Document('.\\mydocx\\nutrition_assessment.docx')

    # 获取word文档内的表格列表
    t = d.tables
    # 第一个表格
    t1 = t[0]
    run = t1.cell(0, 0).paragraphs[0].add_run(info_to_fill_1)
    run.font.name = '宋体'
    run.font.size = 140000
    # 第二个表格
    t2 = t[1]
    run = t2.cell(0, 0).paragraphs[0].add_run(info_to_fill_2)
    run.font.name = '宋体'
    run.font.size = 140000
    if not os.path.exists('temp'):
        os.mkdir('temp')
    else:
        shutil.rmtree('temp')
        os.mkdir('temp')
    random_file_name = generate_rdm_name(8)

    d.save('.\\temp\\%s.docx' % random_file_name)
    # 调试
    # os.startfile(os.path.abspath('.\\temp\\%s.docx' % random_file_name1))
    print_file(os.path.abspath('.\\temp\\%s.docx' % random_file_name))

def drug_bought_by_patient(text_info, drug):
    # 自备药品
    
    info_to_fill = {
        (0, 1): text_info.get('姓名'),  # 姓名
        (0, 5): text_info.get('性别'),  # 性别
        (0, 9): text_info.get('年龄'),  # 年龄
        (1, 1): text_info.get('病房'),  # 科室
        (1, 5): text_info.get('床号'),  # 床号
        (1, 9): text_info.get('住院号'),  # 住院号
        (2, 1): text_info.get('诊断'),  # 诊断
    }
    x = 4
    info_to_fill[(x, 1)] = drug['药品名称']
    info_to_fill[(x, 2)] = drug['规格']
    info_to_fill[(x, 4)] = drug['批号']
    info_to_fill[(x, 6)] = drug['数量']
    info_to_fill[(x, 8)] = drug['厂家']
    info_to_fill[(x, 10)] = drug['途径']
    info_to_fill[(7, 1)] = drug['用途']

    d = Document('.\\mydocx\\自备药品.docx')
    t = d.tables
    t1 = t[0]

    for cell_cord, cell_content in info_to_fill.items():
        run = t1.cell(*cell_cord).paragraphs[0].add_run(cell_content)
        run.font.name = '宋体'
        run.font.size = 140000
    save_name = "%s_%s" % (drug['药品名称'], text_info["姓名"])
    if not os.path.exists('.\\自备药品'):
        os.mkdir('.\\自备药品')
    d.save('.\\自备药品\\%s.docx' % save_name)
    
    os.startfile('.\\自备药品\\%s.docx' % save_name)
    if "免疫球蛋白" in drug['药品名称']:
        d1 = Document('.\\mydocx\\丙种球蛋白.docx')
        t = d1.tables
        t1 = t[0]
        content1 = f"姓名：{text_info.get('姓名')} 性别：{text_info.get('性别')} 年龄：{text_info.get('年龄')} 病室：{text_info.get('床号')} 住院号：{text_info.get('住院号')}"
        content2 = f"临床目前诊断：{text_info.get('诊断')}"
        run = t1.cell(0, 0).paragraphs[0].add_run(content1)
        run.font.name = '宋体'
        run.font.size = 140000
        run1 = t1.cell(1, 0).paragraphs[0].add_run(content2)
        run1.font.name = '宋体'
        run1.font.size = 140000
        save_name_ag = "%s_%s" % ("丙球同意书", text_info["姓名"])

        d1.save('.\\自备药品\\%s.docx' % save_name_ag)
        os.startfile('.\\自备药品\\%s.docx' % save_name_ag)
    # print_file(os.path.abspath('.\\自备药品\\%s.docx' % save_name))
    info_to_fill = {}


def shift_report(result_json):
    # 交班报告
    file_kind = ''
    cur_date = datetime.datetime.strftime(datetime.datetime.today(),
                                          "%Y{}%m{}%d{}").format(
                                              "年", "月", "日")
    one_day = datetime.timedelta(days=1)
    past_date = datetime.datetime.strftime(datetime.datetime.today() - one_day,
                                           "%Y{}%m{}%d{}").format(
                                               "年", "月", "日")

    cur_hour = int(time.strftime("%H", time.localtime()))
    if cur_hour >= 12:
        file_kind = "白班"
        time_string = "%s 08时00分至%s 19时00分" % (cur_date, cur_date)
    else:
        file_kind = "夜班"
        time_string = "%s 19时00分至%s 08时00分" % (past_date, cur_date)
    patient_statistic = "原住院人数 人、入院 %s人、转入 0 人、转出 0 人、出院  人、手术 0 人、操作 0人、抢救 0 人、病危（病重） 0 人、死亡 0 人、危急值 0 人、输血 0 人、现住院人数 人。"

    shift_mod = Document(".\\mydocx\\shift.docx")

    t = shift_mod.tables[0]
    t.rows[0].cells[1].text = time_string

    if len(result_json) > 1:
        flag = True
    else:
        flag = False

    for k, v in result_json.items():
        if flag:
            new_row = deepcopy(t.rows[-3])
            t.rows[-2]._tr.addprevious(new_row._element)
        t.rows[-4].cells[0].text = v.setdefault('床号', '无信息')
        t.rows[-4].cells[1].text = v.setdefault('姓名', '无信息')
        t.rows[-4].cells[2].text = v.setdefault('性别', '无信息')
        t.rows[-4].cells[3].text = v.setdefault('年龄', '无信息')
        t.rows[-4].cells[4].text = '新入'
        zljh = re.sub(r"请陈志鑫中医主治医师.+?治疗。", '', v.setdefault('诊疗计划', '无信息'))
        zljh = re.sub(r"压缩雾化吸入使雾化.+?疗效。", '', zljh) 
        t.rows[-4].cells[
            5].text = '%s 患儿以“%s”为代主诉入院 查体：%s %s 初步诊断：%s 治疗：%s 下班密切注意患儿病情变化。' % (
                v.setdefault('入院时间', '').split()[1] if v.setdefault(
                    '入院时间', '') else '无信息',
                v.setdefault('主诉', '无信息'),
                v.setdefault('TPRBP', '无信息'),
                v.setdefault('入院体检', '无信息'),
                v.setdefault('诊断', '无信息'),
                zljh
            if v.setdefault('诊疗计划', '') else "无信息",
            )

    t.rows[1].cells[1].text = patient_statistic % (str(len(result_json)))
    # 删除倒数第三行
    t.rows[-3]._element.getparent().remove(t.rows[-3]._element)
    t.rows[-1].cells[-2].text = "       交班医师签名：陈白璐"
    # 白班、夜班的接班医师各有不同
    jbr = read_json("接班人.json")
    if file_kind == "白班":
        t.rows[-1].cells[-1].text = "接班医师签名：%s" % jbr.get("白班")
    else:
        t.rows[-1].cells[-1].text = "接班医师签名：%s" % jbr.get("夜班")
    if not os.path.exists('交班报告'):
        os.mkdir('交班报告')
    random_file_name = ''.join(
        random.sample(string.ascii_letters + string.digits, 4))

    shift_mod.save('.\\交班报告\\%s%s%s.docx' %
                   (cur_date, file_kind, random_file_name))
    os.startfile('.\\交班报告\\%s%s%s.docx' %
                 (cur_date, file_kind, random_file_name))
    return cur_date, file_kind, random_file_name


def update_patient_info(str_input):
    # 手动更新入院时病人基本信息(姓名性别年龄床号)
    if not str_input:
        str_input = pyperclip.paste()
    info = {}
    info["姓名"] = re.search("姓名：(\S+)\s+性别：(\S+)\s+年龄：(\S+)\s+科室：(\S+)\s+床号：(\S+)\s+住院号", str_input).group(1)
    info["性别"] = re.search("姓名：(\S+)\s+性别：(\S+)\s+年龄：(\S+)\s+科室：(\S+)\s+床号：(\S+)\s+住院号", str_input).group(2)
    info["年龄"] = re.search("姓名：(\S+)\s+性别：(\S+)\s+年龄：(\S+)\s+科室：(\S+)\s+床号：(\S+)\s+住院号", str_input).group(3)
    info["病房"] = re.search("姓名：(\S+)\s+性别：(\S+)\s+年龄：(\S+)\s+科室：(\S+)\s+床号：(\S+)\s+住院号", str_input).group(4)
    val = re.search("姓名：(\S+)\s+性别：(\S+)\s+年龄：(\S+)\s+科室：(\S+)\s+床号：(\S+)\s+住院号", str_input).group(5)
    if val.isnumeric():
        ward_bed = read_json("ward_bed.json")
        for each in ward_bed:
            
            if str(int(val)) in each['bed']:
                val = str(int(each['ward'])*100+int(val))
                val = str(val).rjust(4, "0")
                break
    info["床号"] = val
    info["住院号"] = re.search("住院号：(\d+)", str_input).group(1)
    return info


def update_patient_info_id(str_input):
    # 利用复制的入院记录信息更新入院时病人基本信息(身份证号，现住址)
    if not str_input:
        str_input = pyperclip.paste()
    info = {}
    orders = [
        ("现住址", "现住址[：:](.+)\r\n", 1),
        ("身份证明号", "身份证明号[：:](\d+)\r\n", 1),
        ("入院体检", "专\s+科\s+情\s+况(.+)辅\s+助\s+检\s+查", 1),
        
    ]
    
    for each in orders:
        try:
            if each[0] == "入院体检":
                r = re.compile(each[1], re.DOTALL)
                zd = r.search(str_input).group(each[2])
                zd = "".join(zd.split("\r\n"))
                zd = zd.replace(" ", "")
                info["入院体检"] = zd
                if zd:
                    pyperclip.copy(zd)
                
            else:
                info[each[0]] = re.search(each[1], str_input).group(each[2])
        except Exception as e:
            info[each[0]] = "None"
            continue
   
   
    return info

def update_patient_info_in(str_input):
    # 手动更新入院时病人基本信息
    if not str_input:
        str_input = pyperclip.paste()

    info = {}
    orders = [
        ("入院时间", "(^\d.+)\r\n", 1),
        ("主诉", "主诉[：:](.+)\r\n", 1),
        ("TPRBP", "查体[：:](.+?)。", 1),
        ("入院体检", "查体[：:](.+?)。(.+)\r\n", 2),
        ("入院化验单", "辅助检查[：:](.+)\r\n", 1),
        ("诊断", "初步诊断[：:](.+)诊断依据", 1),
        ("病例特点", "诊断依据[：:]1[.、](.+)2[.、][入院查体]+[：:](.+)\r\n", 1),
        ("诊疗计划", "诊疗计划[：:]1[.、](.+)2[.、](.+)3[.、](.+)4[.、](.+)\r\n", 2),
        ("拟行检查", "诊疗计划[：:]1[.、](.+)2[.、](.+)3[.、](.+)4[.、](.+)\r\n", 3),
    ]
    # info["入院时间"] = re.search("(^\d.+)\r\n", str_input).group(1)
    
    # info["主诉"] = re.search("主诉[：:](.+)\r\n", str_input).group(1)
    # info["TPRBP"] = re.search("查体[：:](.+?)。", str_input).group(1)
    # info["入院体检"] = re.search("查体[：:](.+?)。(.+)\r\n", str_input).group(2)
    # if not info["入院体检"]:
    #     info["入院体检"] = re.search("诊断依据[：:]1[.、](.+)2[.、]查体[：:](.+)\r\n", str_input).group(2)
    # info["入院化验单"] = re.search("辅助检查[：:](.+)\r\n", str_input).group(1)
    # info["诊断"] = re.search("初步诊断[：:](.+)\r\n", str_input).group(1)
    # info["病例特点"] = re.search("诊断依据[：:]1[.、](.+)2[.、][入院查体]+[：:](.+)\r\n", str_input).group(1)
    # info["诊疗计划"] = re.search("诊疗计划[：:]1[.、](.+)2[.、](.+)3[.、](.+)4[.、](.+)\r\n", str_input).group(2)
    # info["拟行检查"] = re.search("诊疗计划[：:]1[.、](.+)2[.、](.+)3[.、](.+)4[.、](.+)\r\n", str_input).group(3)
    for each in orders:
        try:
            if each[0]=="诊断":
                r = re.compile(each[1], re.DOTALL)
                zd = r.search(str_input).group(each[2])
                zd = "".join(zd.split("\r\n"))
                info["诊断"] = zd.replace("（二）", "")
            else:
                info[each[0]] = re.search(each[1], str_input).group(each[2])
        except Exception as e:
            info[each[0]] = "None"
            continue
    info["入院日期"] = info["入院时间"].split()[0]
    # 清洗诊疗计划
    cleaners = read_json("config.json").get("诊疗计划清洗")
    for each in cleaners:
        info["诊疗计划"] = re.sub(each, '', info["诊疗计划"])

    return info

def update_patient_info_out(str_input):
    if not str_input:
        str_input = pyperclip.paste()
    info = {}
    out_date = re.search("出院日期[：:]\r\n(.+?分)", str_input, re.DOTALL).group(1)
    out_date = re.findall("\d+", out_date)
    info["出院日期"] = ".".join(out_date[:3])
    info["诊疗经过"] = re.search("诊疗经过[：:](.+)\r\n", str_input).group(1)
    r = re.compile("出院诊断[：:](.+)出院情况", re.DOTALL)
    zd = r.search(str_input).group(1)
    zd = "".join(zd.split("\r\n"))
    info["出院诊断"] = zd
    info["出院情况"] = re.search("出院情况[：:](.+)\r\n", str_input).group(1)
    info["出院医嘱"] = re.search("出院医嘱[：:](.+)\r\n", str_input).group(1)
    
    return info

def gen_admisson_card(text_info):
    
    # 入院证
    in_datetime_org = datetime.datetime.strptime(text_info.get('入院时间'), "%Y-%m-%d %H:%M")
    
    # 入院时间转换显示方式
    in_datetime_org_string = datetime.datetime.strftime(in_datetime_org,
                                          "%Y{}%m{}%d{}%H{}%M{}").format(
                                              "年", "月", "日", "时", "分")
    
    # 入院证开具时间=入院时间-随机的分钟数
    rdm_mins = random.randint(15,50)
    
    in_datetime = in_datetime_org-datetime.timedelta(minutes=rdm_mins)
    
    
    in_datetime_string = datetime.datetime.strftime(in_datetime,
                                          "%Y{}%m{}%d{}%H{}%M{}").format(
                                              "年", "月", "日", "时", "分")
                                          
    # 医保认认证时间=入院时间+随机的分钟数
    rdm_mins_auth = random.randint(50, 120)
    
    auth_datetime = in_datetime_org+datetime.timedelta(minutes=rdm_mins_auth)
    
    auth_datetime_string = datetime.datetime.strftime(auth_datetime,
                                          "%Y{}%m{}%d{}%H{}%M{}").format(
                                              "年", "月", "日", "时", "分")
                                          
    d = Document('.\\mydocx\\入院证.docx')
    t = d.tables
    # 第一个表格
    t1 = t[0]
    
    
    info_to_fill_1 = {
        (0, 11):"住院号：%s" % text_info.get('住院号'), 
        
        (1, 1): text_info.get('姓名'),  
        (1, 4): text_info.get('性别'),  
        (1, 7): text_info.get('年龄'),  
        
        (2, 11): text_info.get('身份证明号'),  
       
        (5, 0): "入院诊断：%s" % text_info.get('诊断'), 
        
        (8, -1): in_datetime_string, 
    }    

    for cell_cord, cell_content in info_to_fill_1.items():
        run = t1.cell(*cell_cord).paragraphs[0].add_run(cell_content)
        run.font.name = '宋体'
        run.font.size = 140000
        
    # 第二个表格
    t2 = t[1]
    info_to_fill_2 = {
        (1, 0):in_datetime_org_string, 
        (1, 1):auth_datetime_string, 
        (1, 2):text_info.get('姓名'), 
        (1, 3):text_info.get('身份证明号'), 
        (1, 4):text_info.get('性别'), 
        
     
    }
    
    for cell_cord, cell_content in info_to_fill_2.items():
        run = t2.cell(*cell_cord).paragraphs[0].add_run(cell_content)
        run.font.name = '宋体'
        run.font.size = 140000
        
    # 保存
    rdm_ = generate_rdm_name(4)
    save_name = "%s_%s_%s" % (text_info["姓名"], text_info["住院号"], rdm_)
    if not os.path.exists('.\\入院证'):
        os.mkdir('.\\入院证')
    d.save('.\\入院证\\%s.docx' % save_name)
    
    os.startfile('.\\入院证\\%s.docx' % save_name)
    



    


if __name__ == "__main__":
    # a = read_json("dif_diagnosis.json")
    # add_json("dif_diagnosis_list.json", a.keys())
    print(update_patient_info_in(""))
    
 